package de.dis2011.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

import de.dis2011.data.DB2ConnectionManager;

public class Vertrag
{
    private int id = -1;
    private int vertragsnummer;
    private Date datum;
    private String ort;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public int getVertragsnummer()
    {
        return vertragsnummer;
    }

    public void setVertragsnummer(int vertragsnummer)
    {
        this.vertragsnummer = vertragsnummer;
    }

    public Date getDatum()
    {
        return datum;
    }

    public void setDatum(Date date)
    {
        this.datum = date;
    }

    public String getOrt()
    {
        return ort;
    }

    public void setOrt(String ort)
    {
        this.ort = ort;
    }

    /**
     * Lädt einen Vertrag aus der Datenbank
     * 
     * @param id
     *            ID des zu ladenden Vertrags
     * @return Vertrag-Instanz
     */
    public static Vertrag load(int id)
    {
        try
        {
            // Hole Verbindung
            Connection con = DB2ConnectionManager.getInstance().getConnection();

            // Erzeuge Anfrage
            String selectSQL = "SELECT * FROM vertrag WHERE id = ?";
            PreparedStatement pstmt = con.prepareStatement(selectSQL);
            pstmt.setInt(1, id);

            // Führe Anfrage aus
            ResultSet rs = pstmt.executeQuery();
            if (rs.next())
            {
                Vertrag ts = new Vertrag();
                ts.setId(id);
                ts.setVertragsnummer(rs.getInt("vertragsnummer"));
                ts.setDatum(rs.getDate("datum"));
                ts.setOrt(rs.getString("ort"));
                rs.close();
                pstmt.close();
                return ts;
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Speichert den Vertrag in der Datenbank. Ist noch keine ID vergeben worden,
     * wird die generierte Id von DB2 geholt und dem Model übergeben.
     */
    public void save()
    {
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Füge neues Element hinzu, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                // Achtung, hier wird noch ein Parameter mitgegeben,
                // damit später generierte IDs zurückgeliefert werden!
                String insertSQL = "INSERT INTO vertrag(vertragsnummer, datum, ort) VALUES (?, ?, ?)";

                PreparedStatement pstmt = con.prepareStatement(insertSQL, Statement.RETURN_GENERATED_KEYS);

                // Setze Anfrageparameter und führe Anfrage aus
                pstmt.setInt(1, getVertragsnummer());
                pstmt.setDate(2, (java.sql.Date) getDatum());
                pstmt.setString(3, getOrt());
                pstmt.executeUpdate();

                // Hole die Id des engefügten Datensatzes
                ResultSet rs = pstmt.getGeneratedKeys();
                if (rs.next())
                {
                    setId(rs.getInt(1));
                }

                rs.close();
                pstmt.close();
            }
            else
            {
                // Falls schon eine ID vorhanden ist, mache ein Update...
                String updateSQL = "UPDATE vertrag SET vertragsnummer = ?, datum = ? ort = ? WHERE id = ?";
                PreparedStatement pstmt = con.prepareStatement(updateSQL);

                // Setze Anfrage Parameter
                pstmt.setInt(1, getVertragsnummer());
                pstmt.setDate(2, (java.sql.Date) getDatum());
                pstmt.setString(3, getOrt());
                pstmt.setInt(4, getId());
                pstmt.executeUpdate();

                pstmt.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void delete()
    {
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht gelöscht werden");
            }
            else
            {
                String deleteSQL = "DELETE FROM vertrag WHERE id = ?";
                PreparedStatement pstmt = con.prepareStatement(deleteSQL);

                // Setze Anfrage Parameter
                pstmt.setInt(1, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public void edit()
    {
        // Hole Verbindung
        Connection con = DB2ConnectionManager.getInstance().getConnection();

        try
        {
            // Lösche Element, wenn das Objekt noch keine ID hat.
            if (getId() == -1)
            {
                System.out.println("Was nicht vorhanden ist, kann nicht geändert werden");
            }
            else
            {
                // Falls schon eine ID vorhanden ist, mache ein Update...
                String updateSQL = "UPDATE vertrag SET vertragsnummer = ?, datum = ? ort = ? WHERE id = ?";
                PreparedStatement pstmt = con.prepareStatement(updateSQL);

                // Setze Anfrage Parameter
                pstmt.setInt(1, getVertragsnummer());
                pstmt.setDate(2, (java.sql.Date) getDatum());
                pstmt.setString(3, getOrt());
                pstmt.setInt(4, getId());
                pstmt.executeUpdate();

                pstmt.close();

            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public static Vertrag loadAll() {
        try {
            // Hole Verbindung
            Connection con = DB2ConnectionManager.getInstance().getConnection();

            // Erzeuge Anfrage
            String selectSQL = "SELECT * FROM vertrag";
            PreparedStatement pstmt = con.prepareStatement(selectSQL);

            // Führe Anfrage aus
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                Vertrag ts = new Vertrag();
                ts.setVertragsnummer(rs.getInt("vertragsnummer"));
                ts.setDatum(rs.getDate("datum"));
                ts.setOrt(rs.getString("ort"));

                rs.close();
                pstmt.close();
                return ts;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}
